#!/bin/bash

# 财务管理系统一键启动脚本
# 优化版本 - 包含依赖检查、错误处理、状态验证

set -e  # 遇到错误立即退出

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 获取脚本所在目录
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
BACKEND_DIR="$SCRIPT_DIR/backend"
FRONTEND_DIR="$SCRIPT_DIR/frontend"

log_info "正在启动财务管理系统..."

# 检查系统依赖
check_dependencies() {
    log_info "检查系统依赖..."
    
    # 检查Python3
    if ! command -v python3 &> /dev/null; then
        log_error "Python3 未安装，请先安装 Python3"
        exit 1
    fi
    
    # 检查Node.js
    if ! command -v node &> /dev/null; then
        log_error "Node.js 未安装，请先安装 Node.js"
        exit 1
    fi
    
    # 检查npm
    if ! command -v npm &> /dev/null; then
        log_error "npm 未安装，请先安装 npm"
        exit 1
    fi
    
    log_success "系统依赖检查通过"
}

# 检查项目文件
check_project_files() {
    log_info "检查项目文件..."
    
    if [ ! -d "$BACKEND_DIR" ]; then
        log_error "后端目录不存在: $BACKEND_DIR"
        exit 1
    fi
    
    if [ ! -f "$BACKEND_DIR/manage.py" ]; then
        log_error "Django manage.py 文件不存在"
        exit 1
    fi
    
    if [ ! -d "$FRONTEND_DIR" ]; then
        log_error "前端目录不存在: $FRONTEND_DIR"
        exit 1
    fi
    
    if [ ! -f "$FRONTEND_DIR/package.json" ]; then
        log_error "前端 package.json 文件不存在"
        exit 1
    fi
    
    log_success "项目文件检查通过"
}

# 清理端口占用
cleanup_ports() {
    log_info "检查端口占用情况..."
    
    # 检查8000端口（后端）
    BACKEND_PID=$(lsof -ti :8000 2>/dev/null || true)
    if [ ! -z "$BACKEND_PID" ]; then
        log_warning "端口8000被占用，正在停止进程: $BACKEND_PID"
        kill -9 $BACKEND_PID 2>/dev/null || true
        sleep 2
    fi
    
    # 检查3000端口（前端）
    FRONTEND_PID=$(lsof -ti :3000 2>/dev/null || true)
    if [ ! -z "$FRONTEND_PID" ]; then
        log_warning "端口3000被占用，正在停止进程: $FRONTEND_PID"
        kill -9 $FRONTEND_PID 2>/dev/null || true
        sleep 2
    fi
    
    log_success "端口清理完成"
}

# 安装后端依赖
setup_backend() {
    log_info "设置后端环境..."
    cd "$BACKEND_DIR"
    
    # 检查并安装Python依赖
    if [ -f "requirements.txt" ]; then
        log_info "安装Python依赖..."
        pip3 install -r requirements.txt --quiet || {
            log_error "Python依赖安装失败"
            exit 1
        }
    fi

    # 检查数据库迁移
    log_info "检查数据库迁移..."
    python3 manage.py migrate --check --dry-run > /dev/null 2>&1 || {
        log_warning "检测到未应用的数据库迁移，正在应用..."
        python3 manage.py migrate || {
            log_error "数据库迁移失败"
            exit 1
        }
    }
    
    log_success "后端环境设置完成"
}

# 安装前端依赖
setup_frontend() {
    log_info "设置前端环境..."
    cd "$FRONTEND_DIR"
    
    # 检查node_modules
    if [ ! -d "node_modules" ] || [ ! -f "node_modules/.package-lock.json" ]; then
        log_info "安装前端依赖..."
        npm install --silent || {
            log_error "前端依赖安装失败"
            exit 1
        }
    fi
    
    log_success "前端环境设置完成"
}

# 启动后端服务
start_backend() {
    log_info "启动后端Django服务器..."
    cd "$BACKEND_DIR"
    
    # 启动后端服务器（在后台运行）
    nohup python3 manage.py runserver 8000 > "$SCRIPT_DIR/backend.log" 2>&1 &
    BACKEND_PID=$!
    
    # 保存PID
    echo $BACKEND_PID > "$SCRIPT_DIR/.backend.pid"
    
    # 等待服务启动
    log_info "等待后端服务启动..."
    for i in {1..30}; do
        if curl -s http://localhost:8000 > /dev/null 2>&1; then
            log_success "后端服务器已启动 (PID: $BACKEND_PID)"
            return 0
        fi
        sleep 1
    done
    
    log_error "后端服务器启动超时"
    exit 1
}

# 启动前端服务
start_frontend() {
    log_info "启动前端React应用..."
    cd "$FRONTEND_DIR"
    
    # 设置环境变量，避免自动打开浏览器
    export BROWSER=none
    
    # 启动前端应用（在后台运行）
    nohup npm start > "$SCRIPT_DIR/frontend.log" 2>&1 &
    FRONTEND_PID=$!
    
    # 保存PID
    echo $FRONTEND_PID > "$SCRIPT_DIR/.frontend.pid"
    
    # 等待服务启动
    log_info "等待前端服务启动..."
    for i in {1..60}; do
        if curl -s http://localhost:3000 > /dev/null 2>&1; then
            log_success "前端应用已启动 (PID: $FRONTEND_PID)"
            return 0
        fi
        sleep 1
    done
    
    log_error "前端应用启动超时"
    exit 1
}

# 显示启动信息
show_startup_info() {
    echo
    echo "======================================"
    log_success "财务管理系统启动完成！"
    echo "======================================"
    echo "前端地址: http://localhost:3000"
    echo "后端地址: http://localhost:8000"
    echo "======================================"
    echo "后端进程 PID: $(cat $SCRIPT_DIR/.backend.pid 2>/dev/null || echo 'N/A')"
    echo "前端进程 PID: $(cat $SCRIPT_DIR/.frontend.pid 2>/dev/null || echo 'N/A')"
    echo "======================================"
    echo "日志文件:"
    echo "  后端: $SCRIPT_DIR/backend.log"
    echo "  前端: $SCRIPT_DIR/frontend.log"
    echo "======================================"
    echo "要停止服务，请运行: ./stop.sh"
    echo "======================================"
}

# 错误处理
error_handler() {
    log_error "启动过程中发生错误，正在清理..."
    
    # 清理可能启动的进程
    if [ -f "$SCRIPT_DIR/.backend.pid" ]; then
        BACKEND_PID=$(cat "$SCRIPT_DIR/.backend.pid")
        kill -9 $BACKEND_PID 2>/dev/null || true
        rm -f "$SCRIPT_DIR/.backend.pid"
    fi
    
    if [ -f "$SCRIPT_DIR/.frontend.pid" ]; then
        FRONTEND_PID=$(cat "$SCRIPT_DIR/.frontend.pid")
        kill -9 $FRONTEND_PID 2>/dev/null || true
        rm -f "$SCRIPT_DIR/.frontend.pid"
    fi
    
    exit 1
}

# 设置错误处理
trap error_handler ERR

# 主执行流程
main() {
    check_dependencies
    check_project_files
    cleanup_ports
    setup_backend
    setup_frontend
    start_backend
    start_frontend
    show_startup_info
}

# 执行主函数
main